flat layoutとsrc layoutの比較
プロジェクトのディレクトリ構造が議論されている。
(引用も同記事より)
code:plain
.
├── README.md
├── noxfile.py
├── pyproject.toml
├── setup.py
├── awesome_package/
│ ├── __init__.py
│ └── module.py
└── tools/
├── generate_awesomeness.py
└── decrease_world_suck.py
flat layoutから派生し、import awesome_packageのようにインポートされるべきコードをサブディレクトリsrcに移動したもの。 code:plain
.
├── README.md
├── noxfile.py
├── pyproject.toml
├── setup.py
├── src/
│ └── awesome_package/
│ ├── __init__.py
│ └── module.py
└── tools/
├── generate_awesomeness.py
└── decrease_world_suck.py
The src layout requires installation of the project to be able to run its code, and the flat layout does not.
This means that the src layout involves an additional step in the development workflow of a project (typically, an editable installation is used for development and a regular installation is used for testing).
src layoutではプロジェクトのコードを動かすのに、追加でそのプロジェクトのインストールが必要になる。
flat layoutでは違う
src layoutではプロジェクトの開発フローにさらなる段階が加わる。典型的には、
開発に用いられる。
テストのために用いられる。
The src layout helps prevent accidental usage of the in-development copy of the code.
This is relevant since the Python interpreter includes the current working directory as the first item on the import path. This means that if an import package exists in the current working directory with the same name as an installed import package, the variant from the current working directory will be used. This can lead to subtle misconfiguration of the project’s packaging tooling, which could result in files not being included in a distribution.
The src layout helps avoid this by keeping import packages in a directory separate from the root directory of the project, ensuring that the installed copy is used.
src layoutは間違えて開発中のコードを利用することを防ぐ
なんで?
Pythonインタプリタの仕様では、現在の作業ディレクトリに、インストールされた import パッケージと同じ名前の import パッケージが存在する場合、現在の作業ディレクトリバージョンのパッケージが利用されるため
インポートしたパッケージをルートから隔離されたディレクトリに置くことによって、常に既にインストールされたプログラムの方が先に利用されるようになる
The src layout helps enforce that an editable installation is only able to import files that were meant to be importable.
This is especially relevant when the editable installation is implemented using a path configuration file that adds the directory to the import path.
The flat layout would add the other project files (eg: README.md, tox.ini) and packaging/tooling configuration files (eg: setup.py, noxfile.py) on the import path. This would make certain imports work in editable installations but not regular installations.
flat layoutはプロジェクトの関係ない設定ファイルなどもインポートパスに加えてしまう
code:py
import os
import sys
if not __package__:
# Make CLI runnable from source tree with
# python src/package
package_source_path = os.path.dirname(os.path.dirname(__file__))
sys.path.insert(0, package_source_path)
coronaモジュールのmain()が呼び出されるように、スクリプトをコマンドとして利用可能にしている
code:toml
corona = "corona:main"